//
//  WBRefreshControl.swift
//  Sina
//
//  Created by maling  on 15/11/13.
//  Copyright © 2015年 maling . All rights reserved.
//

import UIKit

// 向下刷新控件偏移量
private let WBRefreshControlOffset: CGFloat = -60
/// 自定义刷新控件， - 负责处理刷新逻辑
class WBRefreshControl: UIRefreshControl {

    // MARK: - 重写系统方法
    override func endRefreshing() {
        super.endRefreshing()
        
        // 停止动画（停止的是小转轮的动画）
        refreshView.stopAnimation()
    }
    /// 主动触发开始刷新动画 - 不会触发监听方法
    override func beginRefreshing() {
        super.beginRefreshing()
        refreshView.startAnimation()
    }
    
    // kVO 监听方法实现监听
    /**
      1. 刷新空间一直都在屏幕上面
      2. 下拉的时候 frame 的 y 一直在减小 向上拖动的时候 y 值一直增加
      3.  默认的 y  是 0
    */
    
    // MARK: KVO监听方法
    override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
        
        // 如果 y 值大于零 说明不在下拉刷新 再向上反动
        if frame.origin.y > 0 {
        
            return
        }
        
        // 判断是否正在刷新 ，如果正在刷新就开始动画
        if refreshing {
        refreshView.startAnimation()
            return
            
        }
        
        // 判断箭头想那个方向指向 向下拉 y 值减小 向上推 y 值增大
        if frame.origin.y < WBRefreshControlOffset && !refreshView.isRotate {
        
            print("箭头向上-反过来")
            refreshView.isRotate = true
        } else if frame.origin.y >= WBRefreshControlOffset && refreshView.isRotate {
            print("箭头向下*转过来")
            refreshView.isRotate = false
        }
        
//        print(frame)
    }
    
    
    /// MARK: - 构造函数
    override init() {
        super.init()
        
        setupUI()
        
    }
   // 这两个都要写， 不管是纯代码 还是从 storyboard 中加载 都可以调用
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
   
        setupUI()
        
        }
   
    
    // 添加控件 - 处理UI控件的
    private func setupUI() {
    
        
        // 隐藏转轮
        tintColor = UIColor.clearColor()

        // 1. 添加控件
        addSubview(refreshView)
        
        // 自动布局 - 使用 XIB 自动布局的时候一定要指定大小
        refreshView.snp_makeConstraints { (make) -> Void in

            make.center.equalTo(self.snp_center)
            make.size.equalTo(refreshView.bounds.size)
            
        }
        // 使用 KVO 监听位置变化 - 主队列 当前主线程上面的任务执行完毕后才执行主队列上的任务
        // 当前运行循环中所有代码执行完毕后 执行循环结束后 运行循环结束前 开始监听
        // 方法触发会在下一次运行循环开始
        dispatch_async(dispatch_get_main_queue()) { () -> Void in
            
            // MARK: 使用kvo 监听属性的变化
            self.addObserver(self, forKeyPath: "frame", options: [], context: nil)
        }
        
    }

    // 销毁 监听kvo 如果不销毁程序会崩溃 使用通知也需要销毁通知中心
    deinit {
        // 删除 KVO 监听方法
        self.removeObserver(self, forKeyPath: "frame")
    }
    
    
    /// 懒加载刷新控件
    private lazy var refreshView = WBRefreshView.refreshView()
//    private lazy var refreshView = WBRefreshView.refreshView()


}

/// 刷新视图 - 负责处理‘动画显示’
class WBRefreshView: UIView {
    // 小箭头
    @IBOutlet weak var tipIconVIew: UIImageView!
    // 整个小箭头View （包括文字）
       // 小转轮
    // 小转轮
    @IBOutlet weak var loadView: UIImageView!
    @IBOutlet weak var tipView: WBRefreshView!
    
    private var isRotate = false {
        didSet {
        
            // 调用动画
            rotateTipIcon()
        }
    }
    // 从 XIB 加载视图
    class func refreshView() -> WBRefreshView {
        
        // 推荐使用 UINib 加载 XIB
        let nib = UINib(nibName: "WBRefreshView", bundle: nil)
        
        return nib.instantiateWithOwner(nil, options: nil)[0] as! WBRefreshView
    }
    
    private func rotateTipIcon() {
    
        var angle = CGFloat(M_PI)
        angle += isRotate ? -0.000001 : 0.000001
        // 添加动画
        // 旋转动画原则： 就近原则 + 顺时针优先
        UIView.animateWithDuration(0.5) { () -> Void in
            
            self.tipIconVIew.transform = CGAffineTransformRotate(self.tipIconVIew.transform, CGFloat(angle))
        }
    }
    
    // 开始动画
    private func startAnimation() {
    
        // 小箭头文本
        tipView.hidden = true
        
        // 如果动画已经正在执行 不需要再添加
        let key = "transform.rotation"
        if (loadView.layer.animationForKey(key) != nil) {
        
            return
        }
        
        
        // 创建一个基本动画
        let animal = CABasicAnimation(keyPath: key)
        animal.toValue = 2 * M_PI
        animal.repeatCount = MAXFLOAT
        animal.duration = 10
        
        // 防止切换控制器回来动画不转了
        animal.removedOnCompletion = false
        loadView.layer.addAnimation(animal, forKey: key)
        
    }
    // 停止动画
    private func stopAnimation() {
    
        tipView.hidden = false
        loadView.layer.removeAllAnimations()
    }
    

    
}
